package doing.doing_001_500;

import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 405. Convert a Number to Hexadecimal 数字转换为十六进制数
 * <p>
 * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，
 * 我们通常使用 补码运算 方法。
 * <p>
 * 注意:
 * 十六进制中所有字母(a-f)都必须是小写。
 * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以
 * 单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将
 * 不会是0字符。给定的数确保在32位有符号整数范围内。不能使用任何由
 * 库提供的将数字直接转换或格式化为十六进制的方法。
 * <p>
 * 示例 1：
 * 输入: 26
 * 输出: "1a"
 * 示例 2：
 * 输入: -1
 * 输出: "ffffffff"
 * <p>
 * 2019-04-14 10:26 PM
 **/
@SuppressWarnings("all")
public class ConvertANumberToHexadecimal {

    private static final char[] HEX_MAP = "0123456789abcdef".toCharArray();

    public String toHex(int num) {
        if (num == 0) {
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        for (; num != 0; num >>>= 4) {
            int x = num & 0b1111;
            sb.append(HEX_MAP[x]);
        }
        return sb.reverse().toString();
    }

    @Test
    public void test() {
        info(toHex(17));
    }
}







































/*
private static final char[] HEX_MAP = "0123456789abcdef".toCharArray();

public String toHex(int num) {
    if (num == 0) {
        return "0";
    }
    StringBuilder sb = new StringBuilder();
    for (; num != 0; num >>>= 4) {
        int x = num & 0b1111;
        sb.append(HEX_MAP[x]);
    }
    return sb.reverse().toString();
}
*/
